(function () {
    "use strict";

    angular.module('core').controller('pedidoAbastecimentoConferenciaController', controller);
    controller.$inject = ['$scope', '$timeout', '$state', '$stateParams', '$q', '$alert', '$confirm', 'pedidoAbastecimentoService', 'lookupService', 'produtoService'];

    function controller($scope, $timeout, $state, $stateParams, $q, $alert, $confirm, pedidoAbastecimentoService, lookupService, produtoService) {
        $scope.initializeLayout('Pedido de Abastecimento');

        //[Inicializa objetos]
        $scope.state = {
            item: { ID: decodeURIComponent($stateParams.id) },
            carregando: false,
            vazio: false,
            statusInicialpedidoAbastecimento: 0,
            tabCorrente: 0,
            tabs: {
                Conferencia: 2,
                Detalhes: 1,
                Produtos: 0,
            },
            tabsConferenciaCorrente: 0,
            tabsConferencia: {
                Pendente: 0,
                Conferido: 1,
            },
            filtro: {
                ativo: false,
                indicaSaldoOrigem: false,
                args: null
            }
        };
        $scope.back = function () {
            $state.go("state-pedido-abastecimento");
        }

        $scope.view = {
            index: 1,
            views: { lista: 0, catalogo: 1 },
        }
        $scope.toggleView = function () {
            $scope.view.index = $scope.view.index == 0 ? 1 : 0;
        };

        $scope.descartar = function () {
            $state.go("state-pedido-abastecimento-detail", { id: $scope.state.item.ID });
        }

        $scope.toggleTodos = function () {
            angular.forEach($scope.state.item.Itens, function (item) {
                item.Ativo = $scope.state.todosAtivos;
            });
        };
        function gerarGuid() {
            return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
                var r = Math.random() * 16 | 0;
                var v = c === 'x' ? r : (r & 0x3 | 0x8);
                return v.toString(16);
            });
        }
        $scope.removerItem = function (item, $event) {

            if ($event) {
                $event.stopPropagation();
            }

            var lista = $scope.state.item.Itens;
            var index = lista.indexOf(item);

            if (index > -1) {
                lista.splice(index, 1);
            }

        };
        //$scope.getPageItems = function () {
        //    if (!$scope.state || !$scope.state.item || !$scope.state.item.Itens)
        //        return [];

        //    var start = ($scope.pager.page - 1) * $scope.pager.pageSize;
        //    var end = start + $scope.pager.pageSize;

        //    return $scope.state.item.Itens.slice(start, end);
        //};


        //Paginação Conferencia
        $scope.closeConferencia = function () {
            $scope.state.carregando = true;
            $scope.state.vazio = false;

            setTimeout(function () {
                pedidoAbastecimentoService
                    .closeConferencia($scope.state.item)
                    .then(
                        function (response) {
                            if (response.Status < 0) {
                                $alert({ text: response.Message, title: $scope.Title });
                            } else {
                                $scope.state.item = response.Data;
                                $state.go("state-pedido-abastecimento-detail", { id: response.Data.ID });
                            }
                            $scope.state.carregando = false;
                            $scope.state.vazio = !$scope.state.item;
                        },
                        function (_error) {
                            $scope.state.carregando = false;
                            $scope.tools.toastr.error('Não foi possível acessar o(s) servidor(es)');
                        }
                    );
            }, 200)
        };

        $scope.conferirItem = function (item) {

            pedidoAbastecimentoService
                .conferirItem(item)
                .then(
                    function (response) {
                        if (response.Status < 0) {
                            $alert({ text: response.Message, title: $scope.Title });
                        } else {
                            item.Conferido = true;
                        }
                        $scope.state.carregando = false;
                        $scope.state.vazio = !$scope.state.item;
                    },
                    function (_error) {
                        $scope.state.carregando = false;
                        $scope.tools.toastr.error('Não foi possível acessar o(s) servidor(es)');
                    }
                );

        }
        $scope.reverterConferenciaItem = function (item) {

            pedidoAbastecimentoService
                .ReverterConferenciaItem(item)
                .then(
                    function (response) {
                        if (response.Status < 0) {
                            $alert({ text: response.Message, title: $scope.Title });
                        } else {
                            item.Conferido = false;
                            item.Quantidade = item.QuantidadeOriginal;
                        }
                        $scope.state.carregando = false;
                        $scope.state.vazio = !$scope.state.item;
                    },
                    function (_error) {
                        $scope.state.carregando = false;
                        $scope.tools.toastr.error('Não foi possível acessar o(s) servidor(es)');
                    }
                );

        }
        $scope.getTotalQuantidade = function (conferido) {
            //return 600
            
            if ($scope.state.item.ItensConferencia) {
                
                return $scope.state.item.ItensConferencia.filter(a => a.Conferido === conferido).length
            }
            else
                return 0
        };
        $scope.sumTotaisConferencia = function (conferido) {
            
            if ($scope.state.item.ItensConferencia) {
                debugger
                var itensFiltrados = $scope.state.item.ItensConferencia.filter(x => x.Conferido === conferido);
                var qtde = itensFiltrados.reduce((soma, y) => soma + (y.Quantidade || 0), 0)
                return qtde;
            }
            else
                return 0
        }
        $scope.paginacaoConferencia = {

            page: 1,
            pageSize: 28,
            pager: {
                page: 1,
                pageSize: 28,
            },
            getFilteredItems: function () {
                if (!$scope.state || !$scope.state.item || !$scope.state.item.ItensConferencia)
                    return [];

                return $scope.state.item.ItensConferencia.filter(this.matchSearch);
            },

            getPageItems: function () {
                var items = $scope.paginacaoConferencia.getFilteredItems();

                var start = ($scope.paginacaoConferencia.page - 1) * $scope.paginacaoConferencia.pageSize;
                var end = start + $scope.paginacaoConferencia.pageSize;

                return items.slice(start, end);
            },

            matchSearch: function (item) {
                var q = ($scope.state.filtro.searchText || "")
                    .toString()
                    .toLowerCase()
                    .trim();
                var itemConferido = false
                debugger
                if ($scope.state.tabsConferenciaCorrente == $scope.state.tabsConferencia.Pendente)
                    itemConferido = !item.Conferido
                else
                    itemConferido = item.Conferido
                if (!q) return itemConferido;

                var nome = (item && item.Produto && item.Produto.Nome
                    ? item.Produto.Nome
                    : "").toString().toLowerCase();

                var codigo = (item && item.Produto && item.Produto.Codigo
                    ? item.Produto.Codigo
                    : "").toString().toLowerCase();

                return itemConferido && (nome.indexOf(q) !== -1 || codigo.indexOf(q) !== -1);
            },

            getTotalItems: function () {
                return ($scope.state && $scope.state.item && $scope.state.item.ItensConferencia)
                    ? $scope.paginacaoConferencia.getFilteredItems().length
                    : 0;
            },

            getTotalPages: function () {
                var total = $scope.paginacaoConferencia.getTotalItems();
                return Math.max(1, Math.ceil(total / $scope.paginacaoConferencia.pageSize));
            },

            getStart: function () {
                return ($scope.paginacaoConferencia.page - 1) * $scope.paginacaoConferencia.pageSize;
            },

            setPage: function (p) {
                var totalPages = $scope.paginacaoConferencia.getTotalPages();

                if (p < 1) p = 1;
                if (p > totalPages) p = totalPages;

                this.page = p;
            },

            prevPage: function () {
                this.setPage($scope.paginacaoConferencia.page - 1);
            },

            nextPage: function () {
                this.setPage($scope.paginacaoConferencia.page + 1);
            }
        };
        $scope.getClassConferido = function (item) {
            if (item.Quantidade == 0)
                return "stock-critical";

            if (item.Quantidade != item.QuantidadeOriginal)
                return "stock-loja-critico";
            return "stock-loja-ideal";
        }
        $scope.popups = {
            addProdutos: {
                ativo: false,
                onToggle: function () {
                    $scope.popups.addProdutos.ativo = !$scope.popups.addProdutos.ativo
                }
            },
        };
        $scope.auxiliar = {
            filial: {
                lookup: function (chaves) {
                    return $q.when(

                        lookupService
                            .getAllFilial({ chaves: chaves })
                            .then(function (response) {

                                if (response.Status < 0)
                                    $scope.tools.toastr.error(response.Message, "Serviço");
                                else
                                    return response.Data;
                            })
                    );
                }
            }, marca: {
                lookup: function (chaves) {
                    return $q.when(
                        lookupService
                            .getAllMarca({ chaves: chaves })
                            .then(function (response) {
                                if (response.Status < 0)
                                    $scope.tools.toastr.error(response.Message, "Serviço");
                                else
                                    return response.Data;
                            })
                    );
                },
            },
            grupo: {
                lookup: function (chaves) {
                    return $q.when(
                        lookupService
                            .getAllGrupo({ chaves: chaves })
                            .then(function (response) {
                                if (response.Status < 0)
                                    $scope.tools.toastr.error(response.Message, "Serviço");
                                else
                                    return response.Data;
                            })
                    );
                },
            },
            fornecedor: {
                lookup: function (chaves) {
                    return $q.when(
                        lookupService
                            .getAllFornecedor({ chaves: chaves })
                            .then(function (response) {
                                if (response.Status < 0)
                                    $scope.tools.toastr.error(response.Message, "Serviço");
                                else
                                    return response.Data;
                            })
                    );
                },
            },
            pedidoAbastecimento: {
                lookup: function (chaves) {
                    return $q.when(
                        lookupService
                            .getAllpedidoAbastecimento({ chaves: chaves })
                            .then(function (response) {
                                if (response.Status < 0)
                                    $scope.tools.toastr.error(response.Message, "Serviço");
                                else
                                    return response.Data;
                            })
                    );
                },
            },
        };

        //[Inicializa funcões]
        $scope.initialize = function () {
            $scope.refresh();
        };

        $scope.get = function () {
            $scope.state.carregando = true;
            $scope.state.vazio = false;
            pedidoAbastecimentoService
                .get($scope.state.item)
                .then(
                    function (response) {
                        if (response.Status < 0) {
                            $scope.tools.toastr.error(response.Message, 'Serviço');
                        } else {
                            $scope.state.item = response.Data;
                            $scope.state.filtro.args = {
                                filial: $scope.state.item.Filial,
                                FilialOrigem: $scope.state.item.FilialOrigem,
                                planoAbastecimento: $scope.state.item.PlanoAbastecimento,
                                filtro: {
                                    IndicaCadastroSimplificado: true
                                }
                            }
                        }
                        $scope.state.carregando = false;
                        $scope.state.vazio = !$scope.state.item;
                    },
                    function (_error) {
                        $scope.state.carregando = false;
                        $scope.tools.toastr.error('Não foi possível acessar o(s) servidor(es)');
                    }
                );
        };

        $scope.refresh = function () {

            $scope.get();

        };
        $scope.getClassEstoqueLoja = function (item) {
            if (item.SaldoLoja <= item.EstoqueCritico)
                return "stock-loja-critico ";
            if (item.SaldoLoja > item.EstoqueCritico && item.SaldoLoja <= item.EstoqueIdeal)
                return "stock-loja-medio";
            return "stock-loja-ideal";
        }

        $scope.save = function () {
            $scope.state.carregando = true;
            $scope.state.vazio = false;

            setTimeout(function () {
                pedidoAbastecimentoService
                    .save($scope.state.item)
                    .then(
                        function (response) {
                            if (response.Status < 0) {
                                $alert({ text: response.Message, title: $scope.Title });
                            } else {
                                $scope.state.item = response.Data;
                                $scope.historyBack();
                            }
                            $scope.state.carregando = false;
                            $scope.state.vazio = !$scope.state.item;
                        },
                        function (_error) {
                            $scope.state.carregando = false;
                            $scope.tools.toastr.error('Não foi possível acessar o(s) servidor(es)');
                        }
                    );
            }, 200)
        };

        $scope.descartar = function () {
            $state.go("state-pedido-abastecimento-detail", { id: $scope.state.item.ID });
        }
        $scope.save = function () {
            $scope.state.carregando = true;
            $scope.state.vazio = false;

            setTimeout(function () {
                pedidoAbastecimentoService
                    .save($scope.state.item)
                    .then(
                        function (response) {
                            if (response.Status < 0) {
                                $alert({ text: response.Message, title: $scope.Title });
                            } else {
                                $scope.state.item = response.Data;
                                $state.go("state-pedido-abastecimento-detail", { id: response.Data.ID });
                            }
                            $scope.state.carregando = false;
                            $scope.state.vazio = !$scope.state.item;
                        },
                        function (_error) {
                            $scope.state.carregando = false;
                            $scope.tools.toastr.error('Não foi possível acessar o(s) servidor(es)');
                        }
                    );
            }, 200)
        };
        $scope.prepare = function () {
            $scope.state.vazio = false;
            pedidoAbastecimentoService
                .prepare($scope.state.item)
                .then(
                    function (response) {
                        if (response.Status < 0) {
                            $scope.tools.toastr.error(response.Message, 'Serviço');
                        } else {
                            $scope.state.item = response.Data;
                        }
                        $scope.state.vazio = !$scope.state.item;
                    },
                    function (_error) {
                        $scope.tools.toastr.error('Não foi possível acessar o(s) servidor(es)');
                    });
        };


        /*Inicializa funções*/
        $scope.initialize();

    }

})();